package hr.ctg.domain.action;

import hr.ctg.domain.action.objekt.SearchParameters;
import hr.ctg.domain.model.Mjesto;
import hr.ctg.domain.model.Objekt;
import hr.ctg.domain.model.Otok;
import hr.ctg.domain.model.Park;
import hr.ctg.domain.model.Zupanija;
import hr.ctg.service.WikiService;
import hr.ctg.service.dao.MjestoDAO;
import hr.ctg.service.dao.OtokDAO;
import hr.ctg.service.dao.ParkDAO;
import hr.ctg.service.dao.TipObjektaDAO;
import hr.ctg.service.dao.ZupanijaDAO;
import hr.ctg.util.StringUtil;

import java.util.Map;

import javax.persistence.EntityManager;

import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.log.Log;

@Name("titleAction")
public class TitleAction {
	@In
	EntityManager entityManager;
	@In
	ParkDAO parkDAO;
	@In
	TipObjektaDAO tipObjektaDAO;
	@In(create = true)
	WikiService wikiService;
	@In
	OtokDAO otokDAO;
	@In
	ZupanijaDAO zupanijaDAO;
	@In
	MjestoDAO mjestoDAO;

	@In("searchParameters")
	SearchParameters searchParametersBean;

	@Logger
	Log log;

	@RequestParameter
	Integer idTipaObjekta;
	@RequestParameter
	Integer idObjekta;
	@RequestParameter
	Integer idMjesta;
	@RequestParameter
	Integer idZupanije;
	@RequestParameter
	Integer idOtoka;
	@RequestParameter
	@Out(required = false)
	String tipParka;
	@RequestParameter
	Integer idParka;
	@RequestParameter
	String searchParameters;
	@In
	Map<String, String> messages;

	@Factory("title1")
	public String getTitle() {
		String title;
		if (searchParameters != null && searchParametersBean != null) {
			title = messages.get("title2.accomodation.search.results");
		} else if (idObjekta != null) {
			final Objekt objekt = entityManager.find(Objekt.class, idObjekta);
			title = messages.get("title2.reviews").replace("{0}",
					objekt.getNaziv()).replace("{1}",
					objekt.getMjesto().getNaziv())
					.replace(
							"{2}",
							messages.get(objekt.getTipObjekta()
									.getIdTipaObjekta()
									+ ""));
		} else if (idMjesta != null) {
			final Mjesto mjesto = entityManager.find(Mjesto.class, idMjesta);

			if (idTipaObjekta != null) {
				title = messages.get("title2.reviews.read").replace("{0}",
						mjesto.getNaziv()).replace("{1}",
						getTitlePluralTipObjekta(idTipaObjekta)).replace("{2}",
						mjesto.getNaziv()).replace("{3}",
						messages.get(idTipaObjekta + ""));
			} else {
				title = messages.get("title2")
						.replace("{0}", mjesto.getNaziv());
			}
		} else if (idZupanije != null) {
			final Zupanija zupanija = entityManager.find(Zupanija.class,
					idZupanije);

			if (idTipaObjekta != null) {
				title = messages.get("title2.reviews.read").replace("{0}",
						getZupanijaLocalized(zupanija)).replace("{1}",
						getTitlePluralTipObjekta(idTipaObjekta)).replace("{2}",
						getZupanijaLocalized(zupanija)).replace("{3}",
						messages.get(idTipaObjekta + ""));
			} else {
				title = messages.get("title2").replace(
						"{0}",
						getZupanijaLocalized(zupanija));
			}
		} else if (idOtoka != null) {
			final Otok otok = entityManager.find(Otok.class, idOtoka);
			if (idTipaObjekta != null) {
				title = messages.get("title2.reviews.read").replace("{0}",
						otok.getNaziv()).replace("{1}",
						messages.get(idTipaObjekta + ".plural")).replace("{2}",
						otok.getNaziv()).replace("{3}",
						messages.get(Integer.toString(idTipaObjekta)));
			} else {
				title = messages.get("title2").replace("{0}", otok.getNaziv());
			}
		} else if (tipParka != null) {
			title = messages.get(messages.get("title2.parkovi." + tipParka));
		} else if (idParka != null) {
			final Park park = entityManager.find(Park.class, idParka);
			title = messages.get("title2").replace("{0}", park.getNaziv());
		} else {
			title = messages.get("title");
		}
		return title;
	}

	public String getUrlTitle(final Object obj) {
		if(null==obj){
			log.error("obj null - trazi razlog...", this);
			return "bez_naslova";
		}
		String title;
		if (obj instanceof Objekt) {
			final Objekt objekt = (Objekt) obj;
			title = StringUtil.clearForUrl(messages
					.get(
							Integer.toString(objekt.getTipObjekta()
									.getIdTipaObjekta())).toLowerCase())
					+ "-"
					+ StringUtil.clearForUrl(objekt.getNaziv())
					+ "-"
					+ StringUtil.clearForUrl(objekt.getMjesto().getNaziv());
		} else if (obj instanceof Mjesto) {
			final Mjesto mjesto = (Mjesto) obj;
			title = StringUtil.clearForUrl(mjesto.getNaziv());
		} else if (obj instanceof Zupanija) {
			final Zupanija zupanija = (Zupanija) obj;
			title = StringUtil.clearForUrl(getZupanijaLocalized(zupanija));
		} else if (obj instanceof Otok) {
			final Otok otok = (Otok) obj;
			title = StringUtil.clearForUrl(otok.getNaziv());
		} else if (obj instanceof Park) {
			final Park park = (Park) obj;
			title = StringUtil.clearForUrl(park.getNaziv());
		} else if (obj instanceof SearchParameters) {
			SearchParameters sp = (SearchParameters) obj;
			title = "";

			if (sp.getMjesto() != null) {
				title += StringUtil.clearForUrl(mjestoDAO.find(
						sp.getMjesto().getIdMjesta()).getNaziv());
			}
			if (sp.getOtok() != null) {
				title += StringUtil.clearForUrl(otokDAO.find(
						sp.getOtok().getIdOtoka()).getNaziv());
			}
			if (sp.getZupanija() != null) {
				title += StringUtil.clearForUrl(getZupanijaLocalized(sp.getZupanija()));
			}
			if (!title.equals("")) {
				title += "_";
			}
			title += getTitlePluralTipObjekta(sp.getTipObjekta().getIdTipaObjekta());
		} else if (tipParka != null) {
			title = StringUtil.clearForUrl(tipParka);
		} else if (idTipaObjekta != null) {
			title = StringUtil.clearForUrl(messages.get(idTipaObjekta.toString())+".plural");
		} else {
			title = null;
		}
		return title;
	}

	public String getUrlTitle(final Mjesto mjesto, final Integer idTipaObjekta) {
		return StringUtil.clearForUrl(mjesto.getNaziv()
				+ "-"
				+ getTitlePluralTipObjekta(idTipaObjekta));
	}

	public String getUrlTitle(final Otok otok, final Integer idTipaObjekta) {
		return StringUtil.clearForUrl(otok.getNaziv()
				+ "-"+ getTitlePluralTipObjekta(idTipaObjekta));
	}

	public String getUrlTitle(final Zupanija zupanija,
			final Integer idTipaObjekta) {
		return StringUtil.clearForUrl(getZupanijaLocalized(zupanija)
				+ "-"
				+ getTitlePluralTipObjekta(idTipaObjekta));
	}
	public String getTitlePluralTipObjekta(Integer idTipaObjekta){
		return messages.get(idTipaObjekta+".plural").toLowerCase();
	}
	public String getZupanijaLocalized(Zupanija zupanija){
		return messages.get("title.zupanija."+zupanija.getIdZupanje());
	}
}
